package cn.com.zzl.util;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.util.List;
import java.util.Map;

/**
 * Description：调用服务接口的工具类
 * Created by 朱正磊 on 2017-07-31 10:30.
 */
public class CallApiUtil {

	/**
	 * @Desc 接口返回值里面业务数据信息对应的key
	 */
	private static final String DATA_KEY = "info";

	/**
	 * @Desc 调用接口所需要的许可证对应的key
	 */
	private static final String LICENSE = "license";

	/**
	 * @Desc 根据请求的参数和调用接口的url获取请求的数据
	 * @param params 调用接口需要传递的参数
	 * @param url 调用接口的url地址
	 * @return 返回接口给予的数据
	 */
	public static String getHttpResultByParams(Map<String, Object> params, String url) {
		//调用接口凭证，许可证
		String license = PropertiesUtil.getLicense();
		params.put(LICENSE, license);
		String paramsContent = JSONUtils.map2JsonString(params);
		return HttpClientUtil.doPostJson(url, paramsContent);
	}

	/**
	 * @Desc 获取接口返回给我们的json数据的Map集合形式
	 * @param params 调用接口需要传递的参数
	 * @param url 调用接口的url地址
	 * @return 返回接口返回的数据，这里我将获取到的json字符串转换成了Map集合，便于数据处理
	 */
	public static Map<String, Object> getHttpResultMapByParams(Map<String, Object> params, String url) {
		return JSONUtils.jsonObjectString2Map(getHttpResultByParams(params, url));
	}

	/**
	 * 注意：如果DATA_KEY对应的value值是JSONObject而不是JSONArray使用该方法。
	 * @Desc 根据请求的参数和调用接口的url获取返回数据里面我们所需要的业务数据DATA_KEY内容。
	 * @param params 调用接口需要传递的参数
	 * @param url 调用接口的url地址
	 * @return 返回返回数据里面的DATA_KEY内容。
	 */
	public static Map<String, Object> getHttpInfoByParams(Map<String, Object> params, String url) {
		//方法一：JSONObject字符串先转Map，从Map里面根据key获取value，这里的value是JSONObject对象，转换过程简单一点。
		Map<String, Object> httpResultMap = getHttpResultMapByParams(params, url);
		JSONObject info = (JSONObject) httpResultMap.get(DATA_KEY);

		//方法二：JSONObject字符串先转JSONObject对象，从JSONObject对象里面根据key获取value，
		//这里的value是JSONObject字符串，再将JSONObject字符串转换成JSONObject对象，转换过程稍微复杂一点。
		/*String httpResult = getHttpResultByParams(params, url);
		JSONObject jsonObject = JSON.parseObject(httpResult);
		String jsonObjectString = jsonObject.getString(DATA_KEY);
		JSONObject info = JSON.parseObject(jsonObjectString);*/

		//方法三：JSONObject字符串先转JSONObject对象，从JSONObject对象里面根据key获取value，
		//这里的value是JSONObject对象
		/*String httpResult = getHttpResultByParams(params, url);
		JSONObject jsonObject = JSON.parseObject(httpResult);
		JSONObject info = (JSONObject) jsonObject.get(DATA_KEY);*/

		return JSONUtils.jsonObject2Map(info);
	}

	/**
	 * 注意：如果DATA_KEY对应的value值是JSONArray而不是JSONObject使用该方法。
	 * @Desc 根据请求的参数和调用接口的url获取返回数据里面我们所需要的业务数据DATA_KEY内容。
	 * @param params 调用接口需要传递的参数
	 * @param url 调用接口的url地址
	 * @return 返回返回数据里面的DATA_KEY内容。
	 */
	public static List<Map<String, Object>> getHttpInfoListByParams(Map<String, Object> params, String url) {
		//方法一：JSONObject字符串先转Map，从Map里面根据key获取value，这里的value是JSONArray对象，转换过程简单一点。
		Map<String, Object> httpResultMap = getHttpResultMapByParams(params, url);
		JSONArray info = (JSONArray) httpResultMap.get(DATA_KEY);

		//方法二：JSONObject字符串先转JSONObject对象，从JSONObject对象里面根据key获取value，
		//这里的value是JSONArray字符串，再将JSONArray字符串转换成JSONArray对象，转换过程稍微复杂一点。
		/*String httpResult = getHttpResultByParams(params, url);
		JSONObject jsonObject = JSON.parseObject(httpResult);
		String jsonArrayString = jsonObject.getString(DATA_KEY);
		JSONArray info = JSON.parseArray(jsonArrayString);*/

		//方法三：JSONObject字符串先转JSONObject对象，从JSONObject对象里面根据key获取value，
		//这里的value是JSONArray对象
		/*String httpResult = getHttpResultByParams(params, url);
		JSONObject jsonObject = JSON.parseObject(httpResult);
		JSONArray info = (JSONArray) jsonObject.get(DATA_KEY);*/

		return JSONUtils.jsonArray2MapList(info);
	}

	/**
	 * 注意：不管DATA_KEY对应的value值是JSONArray还是JSONObject都可以使用该方法。
	 * @Desc 根据请求的参数和调用接口的url获取返回数据里面我们所需要的业务数据DATA_KEY内容。
	 * @param params 调用接口需要传递的参数
	 * @param url 调用接口的url地址
	 * @return 返回返回数据里面的DATA_KEY内容。
	 */
	public static Object getHttpDataByParams(Map<String, Object> params, String url) {
		Map<String, Object> httpResultMap = getHttpResultMapByParams(params, url);
		Object info = httpResultMap.get(DATA_KEY);
		if (info instanceof JSONObject) {
			return JSONUtils.jsonObject2Map((JSONObject) info);
		} else if(info instanceof JSONArray) {
			return JSONUtils.jsonArray2MapList((JSONArray) info);
		}
		return null;
	}

}
